/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compras.beans;

import datamodel.FiltradoDataModel;
import entities.Configuracion;
import entities.Estimacion;
import entities.LineaPedidoFabrica;
import entities.PedidoFabrica;
import entities.Producto;
import entities.ProductoTalla;
import entities.Talla;
import facades.LineaPedidoFabricaFacade;
import facades.PedidoFabricaFacade;
import facades.ProductoTallaFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import productos.qualifiers.EventoFiltrarProducto;
import qualifiers.ConfiguracionActual;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadEditada;
import qualifiers.EventoEntidadElegida;
import sql.FiltradoProductosSQLGenerator;
import ventas.datamodel.TablaPedidoDataModel;

/**
 *
 * @author damfercer
 */
@Named(value = "editarProductosPedidoFabricaBean")
@SessionScoped
public class EditarProductosPedidoFabricaBean implements Serializable {
    @Inject
    private PedidoFabricaFacade pedidoFabricaFacade;
    private FiltradoDataModel filtradoDataModel;
    @Inject
    @EventoFiltrarProducto
    Event<FiltradoDataModel> eventoFiltrarProducto;
    @Inject
    private TablaPedidoDataModel tablaPedidoDataModel;
    private FiltradoProductosSQLGenerator filtradoSQLGenerator;
    private PedidoFabrica pedidoFabrica;
    @Inject
    @EventoEntidadEditada
    private Event<PedidoFabrica> eventoPedidoFabricaEditado;
    private Map<Integer,LineaPedidoFabrica> lineasPedidoFabrica;
    @Inject
    private LineaPedidoFabricaFacade lineaPedidoFabricaFacade;
    @Inject
    private ProductoTallaFacade productoTallaFacade;
    @Inject
    @ConfiguracionActual
    Configuracion configuracion;
    
    @PostConstruct
    public void init(){
        filtradoDataModel=new FiltradoDataModel();
        filtradoSQLGenerator=new FiltradoProductosSQLGenerator();
    }
    
    public void filtrar(){
        //eventoFiltrarProducto.fire(filtradoDataModel);
        String sql=filtradoSQLGenerator.generateSQL(filtradoDataModel);
        getTablaPedidoDataModel().setSql(sql);
        lineasPedidoFabrica=new HashMap<Integer, LineaPedidoFabrica>();
    }
    
    public void onNuevoPedidoFabrica(@Observes @EventoEntidadCreada PedidoFabrica pf){
        init();
        pedidoFabrica=pf;
        filtradoDataModel.setProveedorFiltrado(pf.getProveedor());
        tablaPedidoDataModel.setPedido(pf);
        if(configuracion!=null && configuracion.getTemporada()!=null){
            this.filtradoDataModel.setTemporadaFiltrado(configuracion.getTemporada());
        }
        this.filtrar();
    }
    
    public void onEditarPedido(@Observes @EventoEntidadElegida PedidoFabrica pf){
        init();
        this.pedidoFabrica=pf;
        this.filtradoDataModel.setProveedorFiltrado(pf.getProveedor());
        this.tablaPedidoDataModel.setPedido(pf);
        /*if(configuracion!=null && configuracion.getTemporada()!=null){
            this.filtradoDataModel.setTemporadaFiltrado(configuracion.getTemporada());
        }
        this.filtrar();*/
    }
    
    public LineaPedidoFabrica recuperarLineaPedidoDeProductoTallaVacia(Producto p, Talla t){
        LineaPedidoFabrica linea=null;
        if(p!=null && t!=null){
            ProductoTalla pt=productoTallaFacade.getProductoTallaDeProductoYTalla(p, t);
            if(pt!=null){
                if(!lineasPedidoFabrica.containsKey(pt.getIdProductoTalla())){
                    LineaPedidoFabrica lineaPedidoFabrica=new LineaPedidoFabrica();
                    Integer cantidad=0;
                    if(pt.getEstimacionList()!=null && !pt.getEstimacionList().isEmpty()){
                        Estimacion e=(Estimacion)pt.getEstimacionList().toArray()[0];
                        cantidad=e.getCantidad();
                    }
                    lineaPedidoFabrica.setCantidad(cantidad);
                    lineaPedidoFabrica.setPedidoFabrica(pedidoFabrica);
                    lineaPedidoFabrica.setProductoTalla(pt);
                    lineasPedidoFabrica.put(pt.getIdProductoTalla(),lineaPedidoFabrica);
                }
                linea=lineasPedidoFabrica.get(pt.getIdProductoTalla());
            }
        }
        return linea;
    }
    
    public LineaPedidoFabrica recuperarLineaPedidoDeProductoTalla(Producto p, Talla t){
        LineaPedidoFabrica linea=null;
        if(p!=null && t!=null){
            Boolean encontrado=false;
            for(LineaPedidoFabrica lp: pedidoFabrica.getLineaPedidoFabricaList()){
                if(lp.getProductoTalla().getProducto().getIdProducto()==p.getIdProducto() && lp.getProductoTalla().getTalla().getIdTalla()==t.getIdTalla()){
                    linea=lp;
                    encontrado=true;
                    break;
                }
            }
            if(!encontrado){
                if(p!=null && t!=null){
                    ProductoTalla pt=productoTallaFacade.getProductoTallaDeProductoYTalla(p, t);
                    if(pt!=null){    
                        linea=new LineaPedidoFabrica();
                        linea.setCantidad(0);
                        linea.setPedidoFabrica(pedidoFabrica);
                        linea.setProductoTalla(productoTallaFacade.getProductoTallaDeProductoYTalla(p, t));
                        pedidoFabrica.getLineaPedidoFabricaList().add(linea);
                    }
                }
            } 
        }
        return linea;
    }
    
    public void editarProductoGuardado(Producto p, Talla t){
            LineaPedidoFabrica lp=recuperarLineaPedidoDeProductoTalla(p, t);
            if(lp.getIdLineaPedidoFabrica()!=null){
                if(lp.getCantidad()!=0){
                    lineaPedidoFabricaFacade.edit(lp);
                }
                else{
                    lineaPedidoFabricaFacade.remove(lp);
                }
            }
            else{
                if(lp.getCantidad()!=0){
                    lineaPedidoFabricaFacade.create(lp);
                }
            }
    }
    
    public void addProductos(){
        for(LineaPedidoFabrica lp: lineasPedidoFabrica.values()){
            if(lp.getCantidad()!=0){
                lineaPedidoFabricaFacade.create(lp);
                pedidoFabrica.getLineaPedidoFabricaList().add(lp);
            }
        }
        lineasPedidoFabrica=null;
    }
    
    public void cerrarTablaAddProductos(){
        lineasPedidoFabrica=null;
    }
    
    /**
     * @return the pedido
     */
    public PedidoFabrica getPedidoFabrica() {
        return pedidoFabrica;
    }

    /**
     * @param pedido the pedido to set
     */
    public void setPedidoFabrica(PedidoFabrica pedidoFabrica) {
        this.pedidoFabrica = pedidoFabrica;
    }
    
    /**
     * @return the tablaPedidoDataModel
     */
    public TablaPedidoDataModel getTablaPedidoDataModel() {
        return tablaPedidoDataModel;
    }

    /**
     * @param tablaPedidoDataModel the tablaPedidoDataModel to set
     */
    public void setTablaPedidoDataModel(TablaPedidoDataModel tablaPedidoDataModel) {
        this.tablaPedidoDataModel = tablaPedidoDataModel;
    }
    
      /**
     * @return the filtradoDataModel
     */
    public FiltradoDataModel getFiltradoDataModel() {
        return filtradoDataModel;
    }

    /**
     * @param filtradoDataModel the filtradoDataModel to set
     */
    public void setFiltradoDataModel(FiltradoDataModel filtradoDataModel) {
        this.filtradoDataModel = filtradoDataModel;
    }

    /**
     * @return the lineasPedido
     */
    public Map<Integer,LineaPedidoFabrica> getLineasPedidoFabrica() {
        return lineasPedidoFabrica;
    }

    /**
     * @param lineasPedidoFabrica the lineasPedido to set
     */
    public void setLineasPedidoFabrica(Map<Integer,LineaPedidoFabrica> lineasPedidoFabrica) {
        this.lineasPedidoFabrica = lineasPedidoFabrica;
    }
}
